package util.docfilter.impl;

import java.util.regex.Pattern;

import cn.edu.bjtu.labsys.entity.IDocument;
import util.docfilter.DocumentFilter;
/**
 * 
 * @author 李宏韬
 *
 */
public class DocumentFilterImpl implements DocumentFilter{

	@Override
	public boolean shouldKeep(IDocument document) {
		
		
		return filterText(document.getContent()) == null?false:true;
//		String line=filterText(document.getContent());
//		if(line==null)
//		return false;
//		else return true;
	}

	public static String filterText(String line){
		/*
		 * 这里写的问题,你看训练集里面的文档,每个都是4个。。开始的，形式如 。。      。。 a然后才是具体内容，应该行先把line前面这个去除，然后判断line的长度
		 */
		line = line.trim();
		if(line.length()<=10){
			return null;
		}else{
			/*
			 * 没必要遍历整个所有的文档,每个文档都遍历一次太浪费时间,随机取10个位置差不多了,因为如果一篇文档是非中英文文字的话,基本上整篇都是这种文字了
			 * 随机取10个位置,如果里面超过N个(具体多少自己定)就把这个文档舍弃
			 */
			for(int i=0;i<line.length();){
				char ch=line.charAt(i);
				if(checkChinese(ch)||checkEnglish(ch)){
					i++;
				}else{
					return null;
				}
			}
			return line;
		}
	}
	
	public static boolean checkChinese(char c){
	    Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
            return true;
        }
        return false;
	}
	static Pattern pattern =Pattern.compile("[a-zA-Z0-9]|[`~!@#$%^&*()+=|\\s{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]");
	public static boolean checkEnglish(char c){
		/*
		 * c是一个字符,调用这String.value(c)很多余,不如直接写成
		 * c == ' '这样判断,如果为空直接返回,不在进行,正则表达试编译不要放在这个方法中,每个char都编译一次是性能极大浪费,10000个文档有多少个char?你这编译了多少次
		 * 不知道javac字码码优化成什么样,但是不要这样写
		 * 判断char是不是英文或者特征符号直接根据ascii码表来,使用正则表达式大材小用了
		 */
		return pattern.matcher(String.valueOf(c).trim()).find();
	}

	/* (non-Javadoc)
	 * @see util.docfilter.DocumentFilter#shouldKeep(java.lang.String)
	 */
	@Override
	public boolean shouldKeep(String s) {
		// TODO Auto-generated method stub
		return false;
	}


}
